/*
Copyright (c) [2019年5月1日] [吴超]
[MBT_Studio] is licensed under Mulan PSL v2.
You can use this software according to the terms and conditions of the Mulan PSL v2.
You may obtain a copy of Mulan PSL v2 at:
		 http://license.coscl.org.cn/MulanPSL2
THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
See the Mulan PSL v2 for more details.
*/
#pragma once

#include "代码编译结构定义.h"

struct S_代码模块 {
    std::set<std::u16string> 类型声明;
    std::set<std::u16string> 函数声明;
    std::set<std::u16string> 全局变量;
    std::map<std::u16string, S_代码模块*> 子模块;
};

struct S_导出模块 {
    std::map<std::u16string, std::u16string> 变量;
    std::map<std::u16string, S_函数声明代码&> 函数;
    std::map<std::u16string, S_结构代码块&> 结构;
    
    std::map<std::u16string, S_导出模块*> 子模块;
}

struct S_当前文件导入模块 {
    S_代码模块 导入所有模块;
    std::map<std::u16string, S_代码模块*> 导入模块;
};

/*struct S_代码模块导入 {
    std::map<std::u16string, S_模块&> 导入模块;
};*/


S_代码模块& f_model_构建模块(const std::u16string& 模块名称);
bool f_model_添加模块结构(S_代码模块& 模块, const std::u16string& 结构声明);
bool f_model_添加模块函数(S_代码模块& 模块, const std::u16string& 函数声明);

void f_导入依赖模块(std::set<std::filesystem::path>&& paths, const std::u16string& name);
void f_解析导入模块代码(std::vector<std::u16string>::iterator& it
                , std::vector<std::u16string>::iterator& end
                , S_当前文件导入模块& 模块
                , const std::u16string& 工程名称
                );


S_代码模块导入 f_model_import(const std::vector<std::u16string>& 导入模块);
S_代码模块导入 f_model_export(const std::vector<std::u16string>& 导出模块);

bool f_model_类型是否以存在(S_代码模块& 模块, const std::u16string& name);
bool f_model_函数是否以存在(S_代码模块& 模块, const std::u16string& name);



